#include "version.h"

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#ifdef HAVE_V4L2
# include <libavdevice/avdevice.h>
#endif
#ifdef HAVE_USB
# include <libusb-1.0/libusb.h>
#endif

void
scrcpy_print_version(void) {
    printf("\nDependencies (compiled / linked):\n");

    // 解析SDL2的具体版本信息
    SDL_version sdl;
    SDL_GetVersion(&sdl);
    printf("前面的版本是引用的头文件中定义的版本，后面的版本是运行时获取的动态库中定义的版本。下同\n");
    printf(" - SDL: %u.%u.%u / %u.%u.%u\n",
           SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL,
           (unsigned) sdl.major, (unsigned) sdl.minor, (unsigned) sdl.patch);
    
    // 查询libavcodec模块的版本号
    // ffmpeg-编解码库。libavcodec提供编解码 x264、avc、hevc等的处理
    unsigned avcodec = avcodec_version();
    printf(" - libavcodec: %u.%u.%u / %u.%u.%u\n",
           LIBAVCODEC_VERSION_MAJOR,
           LIBAVCODEC_VERSION_MINOR,
           LIBAVCODEC_VERSION_MICRO,
           AV_VERSION_MAJOR(avcodec),
           AV_VERSION_MINOR(avcodec),
           AV_VERSION_MICRO(avcodec));

    // ffmpeg-文件格式和协议库。libavformat提供文件格式如 mp4、mp3、m4a等的解封装和封装处理，以及rtp、rtmp、rtcp等的协议处理
    unsigned avformat = avformat_version();
    printf(" - libavformat: %u.%u.%u / %u.%u.%u\n",
           LIBAVFORMAT_VERSION_MAJOR,
           LIBAVFORMAT_VERSION_MINOR,
           LIBAVFORMAT_VERSION_MICRO,
           AV_VERSION_MAJOR(avformat),
           AV_VERSION_MINOR(avformat),
           AV_VERSION_MICRO(avformat));

    // ffmpeg-libavutil提供基本工具类,ffmpeg中的其他模块或多或少的都依赖此模块
    unsigned avutil = avutil_version();
    printf(" - libavutil: %u.%u.%u / %u.%u.%u\n",
           LIBAVUTIL_VERSION_MAJOR,
           LIBAVUTIL_VERSION_MINOR,
           LIBAVUTIL_VERSION_MICRO,
           AV_VERSION_MAJOR(avutil),
           AV_VERSION_MINOR(avutil),
           AV_VERSION_MICRO(avutil));

#ifdef HAVE_V4L2
    // V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动
    // ffmpeg-音视频滤镜库，该模块提供了包括音频特效和视频特效的处理
    unsigned avdevice = avdevice_version();
    printf(" - libavdevice: %u.%u.%u / %u.%u.%u\n",
           LIBAVDEVICE_VERSION_MAJOR,
           LIBAVDEVICE_VERSION_MINOR,
           LIBAVDEVICE_VERSION_MICRO,
           AV_VERSION_MAJOR(avdevice),
           AV_VERSION_MINOR(avdevice),
           AV_VERSION_MICRO(avdevice));
#endif

#ifdef HAVE_USB
    // 官网  https://libusb.info/
    // libusb是一个C库,它提供了通用的访问USB设备。 它的目的是供开发人员使用方便的生产与USB通信硬件的应用程序
    const struct libusb_version *usb = libusb_get_version();
    // The compiled version may not be known
    printf(" - libusb: - / %u.%u.%u\n",
           (unsigned) usb->major, (unsigned) usb->minor, (unsigned) usb->micro);
#endif
}
